#include <head.h>

// 定义信号量
sem_t sem_A, sem_B, sem_C;

// 工序A
void *process_A(void *arg)
{
    printf("工序 A 开始.\n");
    // 模拟处理时间
    sleep(1);
    printf("工序 A 完成.\n");
    // 释放信号量B，允许工序B开始
    sem_post(&sem_B);
    return NULL;
}

// 工序B
void *process_B(void *arg)
{
    // 等待信号量A，确保工序A完成后再开始工序B
    sem_wait(&sem_B);
    printf("工序 B 开始.\n");
    // 模拟处理时间
    sleep(1);
    printf("工序 B 完成.\n");
    // 释放信号量C，允许工序C开始
    sem_post(&sem_C);
    return NULL;
}

// 工序C
void *process_C(void *arg)
{
    // 等待信号量B，确保工序B完成后再开始工序C
    sem_wait(&sem_C);
    printf("工序 C 开始.\n");
    // 模拟处理时间
    sleep(1);
    printf("工序 C 完成.\n");
    return NULL;
}

int main()
{
    // 初始化信号量
    sem_init(&sem_A, 0, 1); // 初始值为1，表示工序A可以开始
    sem_init(&sem_B, 0, 0); // 初始值为0，表示工序B需要等待工序A完成
    sem_init(&sem_C, 0, 0); // 初始值为0，表示工序C需要等待工序B完成

    // 创建线程
    pthread_t thread_A, thread_B, thread_C;
    pthread_create(&thread_A, NULL, process_A, NULL);
    pthread_create(&thread_B, NULL, process_B, NULL);
    pthread_create(&thread_C, NULL, process_C, NULL);

    // 等待线程结束
    pthread_join(thread_A, NULL);
    pthread_join(thread_B, NULL);
    pthread_join(thread_C, NULL);

    // 销毁信号量
    sem_destroy(&sem_A);
    sem_destroy(&sem_B);
    sem_destroy(&sem_C);

    return 0;
}
